在昨天我們有提到 "自" 注意力機制,現在我們更詳細的來看具體是怎麼算的。
先定義一下 "做 attention" 這件事就是收 2 個向量,然後輸出一個分數告訴你這兩個向量有多配,至於怎麼算有很多種,像是昨天說的內積。
假設我們輸入是 [x1,x2,x3,x4] 我們先把這個東西做 embedding,變成 [a1,a2,a3,a4]
把 [a1,a2,a3,a4] 丟進 "自"注意力機制中做運算,每個 input 都各別乘上 3 種不同的矩陣[w1,w2,w3],會得到 3 個新 Vector 就是 Query,Key,Value
[q1,q2,q3,q4],[k1,k2,k3,k4],[v1,v2,v3,v4]
把每個 q 對做每個 k 都做 attention 得到 [alpha1,alpha2,alpha3,alpha4]],以論文上來講 "做 attention" 這件事是
alpha = q。k^i / sqrt(d) ,d is the dim of q and k
把每個 alpha 做 softmax 得到 alpha^ 這邊其實你會發現跟昨天的一樣
把結果個別乘上 v 然後加總然後得到輸出 b1,相信大家都看過下面這張圖XD
這裡就是和 RNN 不一樣的地方了,你會發現對電腦而言,b1,b2 這些是可以平行運算的!
剛剛上面有提到 q,k,v,Multi-Head 顧名思義就是把這些分裂成 2 份(或更多),然後後做一樣的事,注意雖然分成兩份 [qi1,qj],但 qi 只會對 ki,vi 做,qj 也一樣,最後把兩份不同的 b concatenate 起來,看下面這張圖就知道了。
為什麼沒事要給自己找麻煩呢? 其實這麼做是有原因的,上面我們提到不想讓有的 head 知道其他地方的資訊,但又想讓某個 head 知道其他地方的資訊,就可以這樣處理。
如果照上面算下來,你會發現對 b 來講,輸入順序這件事毫無意義的,因為對 b 而言它就是對所有的輸入做 self-attention,b 是沒有輸入前後位置的概念的,但這顯然不對,而解決這個問題德方法,就是 Positional Encoding。
這個 e^i 不是訓練出來的,它是人工設定的,用的時候只要把它加上 a^i 就好了。(之後再說這個怎麼生的)
來看一張被轉貼到爛的圖,再經過我的巧手之後變得更爛了XD
decoder 還有一些小差異我們明天繼續講
Hung-yi Lee 老師的內容都很扎實好理解,而且還無私地分享給大家,抱持著感恩的心收看吧 XD !